/**
 * Execute Command 工具
 * 执行终端命令（单一数据源实现）
 */

import { AbstractTool } from './base';
import { executeCommandTool } from '../utils/commandExecutor';
import type { ToolResult, ToolParameter } from '../types/types';

/**
 * 命令执行工具
 * 自包含定义：逻辑、UI元数据、参数校验集于一身
 */
export class ExecuteCommandTool extends AbstractTool {
    // ============================================================
    // 1. 核心元数据
    // ============================================================
    readonly id = 'executeCommand';
    readonly name = 'Execute Command';
    readonly description = '执行终端命令。支持 CMD, PowerShell 和 Bash。';
    readonly icon = 'terminal';
    
    // ============================================================
    // 2. 行为配置
    // ============================================================
    protected readonly requireConfirm = true;

    // ============================================================
    // 3. 参数定义
    // ============================================================
    protected getParameters(): ToolParameter[] {
        return [
            {
                name: 'command',
                type: 'string',
                description: '要执行的命令 (例如: dir /w 或 ls -la)',
                required: true
            },
            {
                name: 'shell',
                type: 'enum', // 下拉框类型
                description: '执行引擎',
                required: true,
                options: [
                    { label: 'PowerShell', value: 'powershell' },
                    { label: 'CMD', value: 'cmd' },
                    { label: 'Bash', value: 'bash' }
                ],
                defaultValue: process.platform === 'win32' ? 'powershell' : 'bash'
            },
            {
                name: 'cwd',
                type: 'string',
                description: '工作目录 (可选)',
                required: false,
                defaultValue: '.'
            },
            {
                name: 'timeout',
                type: 'number',
                description: '超时时间 (ms)',
                required: false,
                defaultValue: 30000
            }
        ];
    }

    // ============================================================
    // 4. 执行逻辑
    // ============================================================
    async execute(args: Record<string, any>, callId: string): Promise<ToolResult> {
        if (!args.command || typeof args.command !== 'string') {
            return this.createErrorResult(callId, 'Missing required parameter: command', 0);
        }

        // 透传 args (包含 command, shell, cwd, timeout) 给执行器
        return await executeCommandTool(args, callId);
    }
}